package com.crrc.sandameter

import com.cj.mvvmlib.base.viewmodel.BaseViewModel
import java.nio.charset.StandardCharsets

class MainViewModel : BaseViewModel() {

    /**
     * 解析体重数据。
     */
    fun parseWeightData(data: ByteArray): Double? {
        if (data.size != 8) {
            println("Error: Invalid data length. Expected 8 bytes, but received ${data.size} bytes.")
            return null
        }

        try { // 将ASCII字节数组转换为字符串。
            val dataString = String(data, StandardCharsets.US_ASCII)

            // 验证数据字符串是否以'='结尾。
            if (!dataString.endsWith("=")) {
                println("Error: Data string does not end with '='. Invalid format.")
                return null
            }

            // 确定数字是否为负数。
            // 根据这个例子，负号‘-’出现在‘=’之前。
            val isNegative = dataString[dataString.length - 2] == '-'

            // 提取字符串的数字部分。
            // 我们需要删除后面的‘=’和潜在的‘-’符号。
            val numericalString = if (isNegative) { // 如果为负数，则删除最后两个字符（‘-’和‘=’）
                dataString.substring(0, dataString.length - 2)
            } else { // 如果为正，则只删除最后一个字符（'='）
                dataString.substring(0, dataString.length - 1)
            }

            //尝试将数字字符串解析为Double类型。
            // 使用trim（）删除任何可能的前导/尾随空格，尽管在此协议中不太可能。
            val weight = numericalString.trim().toDouble()

            // 如果存在负号，则应用负号。
            return if (isNegative) -weight else weight

        } catch (e: NumberFormatException) { // 捕获字符串到Double转换期间的潜在错误。
            e.printStackTrace()
            return null
        } catch (e: Exception) { // 在处理过程中捕获任何其他意外错误。
            e.printStackTrace()
            return null
        }
    }
}